深入理解包管理----前言
为啥要写包管理系列文章
关于systemserver相关的文章Android大脑--systemserver进程和systemserver进程监控者--watchdog就先告一段落了,从本篇开始将介绍包管理相关的文章,这里的包管理其实指的就是PackageManagerService (以下简写为PMS),PMS在整个Android中的地位不言而喻,PMS包含的知识很多比如apk的安装/更新/卸载,权限管理,apk信息查询等,因此不是一两篇文章可以介绍完的,故写成一个系列来介绍PMS。
都有哪些内容
暂且规划以下内容,有可能在写的过程中会增加别的内容。
1.各种复杂繁多的数据类
在刚开始接触PMS的时候,我个人感觉最令我头疼的就是数据类真的是太多了,比如PackageSetting、PackageImpl、PackageUserStateImpl、LegacyPermissionSettings、Permission、PermissionInfo等等,有的看了名字后感觉它们要表达的意思都差不多比如Permission、PermissionInfo。因此我希望把这些数据类整理清楚、整理明白了分享与大家。
2. 如何高效的提供数据服务
大家都知道PMS持有了所有已安装apk的各种数据,如apk中声明的四大组件、使用到的权限、使用到的共享库等等.而这些数据是不断的动态变化的,因此会使用到锁来保持这些数据的一致性,当安装的apk很多的时候,那PMS持有的这些数据是非常庞大的。
大家都知道PMS持有的这些数据是会供使用者来进行查询的,比如ActivityTaskManagerService在启动Activity的时候根据Component从PMS查询对应的Activity信息,再比如在启动app进程的时候ActivityManagerService需要从根据包名从PMS查询对应的ApplicationInfo信息。
像PMS持有如此庞大的数据,并且这些数据使用锁来保证它们的一致性,那该如何保证提供高效、稳定的查询服务呢?
答案是使用快照(snapshot)、观察者模式,这也会在系列文章中介绍。
3. 权限管理
基本每个安装在Android设备上的apk都会申请一些权限,而权限的申请、权限的声明这些操作都归PermissionManagerService服务负责。这也会在系列文章中介绍。
4. 共享库
在AndroidManifest清单文件中是可以使用uses-library、uses-native-library标签来使用系统或者其他apk提供的共享库的,并且系统apk可以在AndroidManifest清单文件中使用library标签来声明一个共享库供别的程序来使用的,还包括共享库是如何被app进程使用的等,这些在系列文章中都会涉及到。
5. apk扫描、安装
在PMS构造方法中会对所有apk (系统apk、普通apk)进行扫描,那为啥要进行这些扫描呢?apk的安装为啥需要使用PackageSetting这个数据类来保存它的信息呢?
当然还包括AndroidManifest清单文件内容解析、PMS启动等等。欢迎大家关注后面的精彩内容。